1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.lang3.builder;
18  
19  import static org.junit.Assert.assertEquals;
20  import static org.junit.Assert.assertNull;
21  import static org.junit.Assert.assertSame;
22  import static org.junit.Assume.assumeFalse;
23  
24  import java.util.ArrayList;
25  import java.util.HashMap;
26  import java.util.List;
27  import java.util.Map;
28  
29  import org.apache.commons.lang3.SystemUtils;
30  import org.junit.After;
31  import org.junit.Test;
32  
33  /**
34   * Unit tests for {@link org.apache.commons.lang3.builder.ToStringBuilder}.
35   *
36   * @version $Id$
37   */
38  public class ToStringBuilderTest {
39  
40      private final Integer base = Integer.valueOf(5);
41      private final String baseStr = base.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(base));
42  
43      /*
44       * All tests should leave the registry empty. 
45       */
46      @After
47      public void after(){
48          validateNullToStringStyleRegistry();
49      }
50  
51      //-----------------------------------------------------------------------
52  
53      @Test
54      public void testConstructorEx1() {
55          assertEquals("<null>", new ToStringBuilder(null).toString());
56      }
57  
58      @Test
59      public void testConstructorEx2() {
60          assertEquals("<null>", new ToStringBuilder(null, null).toString());
61          new ToStringBuilder(this.base, null).toString();
62      }
63  
64      @Test
65      public void testConstructorEx3() {
66          assertEquals("<null>", new ToStringBuilder(null, null, null).toString());
67          new ToStringBuilder(this.base, null, null).toString();
68          new ToStringBuilder(this.base, ToStringStyle.DEFAULT_STYLE, null).toString();
69      }
70  
71      @Test
72      public void testGetSetDefault() {
73          try {
74              ToStringBuilder.setDefaultStyle(ToStringStyle.NO_FIELD_NAMES_STYLE);
75              assertSame(ToStringStyle.NO_FIELD_NAMES_STYLE, ToStringBuilder.getDefaultStyle());
76          } finally {
77              // reset for other tests
78              ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
79          }
80      }
81  
82      @Test(expected=IllegalArgumentException.class)
83      public void testSetDefaultEx() {
84          ToStringBuilder.setDefaultStyle(null);
85      }
86  
87      @Test
88      public void testBlank() {
89          assertEquals(baseStr + "[]", new ToStringBuilder(base).toString());
90      }
91  
92      /**
93       * Test wrapper for int primitive.
94       */
95      @Test
96      public void testReflectionInteger() {
97          assertEquals(baseStr + "[value=5]", ToStringBuilder.reflectionToString(base));
98      }
99  
100     /**
101      * Test wrapper for char primitive.
102      */
103     @Test
104     public void testReflectionCharacter() {
105         final Character c = new Character('A');
106         assertEquals(this.toBaseString(c) + "[value=A]", ToStringBuilder.reflectionToString(c));
107     }
108 
109     /**
110      * Test wrapper for char boolean.
111      */
112     @Test
113     public void testReflectionBoolean() {
114         Boolean b;
115         b = Boolean.TRUE;
116         assertEquals(this.toBaseString(b) + "[value=true]", ToStringBuilder.reflectionToString(b));
117         b = Boolean.FALSE;
118         assertEquals(this.toBaseString(b) + "[value=false]", ToStringBuilder.reflectionToString(b));
119     }
120 
121     /**
122      * Create the same toString() as Object.toString().
123      * @param o the object to create the string for.
124      * @return a String in the Object.toString format.
125      */
126     private String toBaseString(final Object o) {
127         return o.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(o));
128     }
129 
130     // Reflection Array tests
131 
132     //
133     // Note on the following line of code repeated in the reflection array tests.
134     //
135     // assertReflectionArray("<null>", array);
136     //
137     // The expected value is not baseStr + "[<null>]" since array==null and is typed as Object.
138     // The null array does not carry array type information.
139     // If we added a primitive array type constructor and pile of associated methods,
140     // then type declaring type information could be carried forward. IMHO, null is null.
141     //
142     // Gary Gregory - 2003-03-12 - ggregory@seagullsw.com
143     //
144 
145     public void assertReflectionArray(final String expected, final Object actual) {
146         if (actual == null) {
147             // Until ToStringBuilder supports null objects.
148             return;
149         }
150         assertEquals(expected, ToStringBuilder.reflectionToString(actual));
151         assertEquals(expected, ToStringBuilder.reflectionToString(actual, null));
152         assertEquals(expected, ToStringBuilder.reflectionToString(actual, null, true));
153         assertEquals(expected, ToStringBuilder.reflectionToString(actual, null, false));
154     }
155 
156     @Test
157     public void testReflectionObjectArray() {
158         Object[] array = new Object[] { null, base, new int[] { 3, 6 } };
159         final String baseString = this.toBaseString(array);
160         assertEquals(baseString + "[{<null>,5,{3,6}}]", ToStringBuilder.reflectionToString(array));
161         array = null;
162         assertReflectionArray("<null>", array);
163     }
164 
165     @Test
166     public void testReflectionLongArray() {
167         long[] array = new long[] { 1, 2, -3, 4 };
168         final String baseString = this.toBaseString(array);
169         assertEquals(baseString + "[{1,2,-3,4}]", ToStringBuilder.reflectionToString(array));
170         array = null;
171         assertReflectionArray("<null>", array);
172     }
173 
174     @Test
175     public void testReflectionIntArray() {
176         int[] array = new int[] { 1, 2, -3, 4 };
177         final String baseString = this.toBaseString(array);
178         assertEquals(baseString + "[{1,2,-3,4}]", ToStringBuilder.reflectionToString(array));
179         array = null;
180         assertReflectionArray("<null>", array);
181     }
182 
183     @Test
184     public void testReflectionShortArray() {
185         short[] array = new short[] { 1, 2, -3, 4 };
186         final String baseString = this.toBaseString(array);
187         assertEquals(baseString + "[{1,2,-3,4}]", ToStringBuilder.reflectionToString(array));
188         array = null;
189         assertReflectionArray("<null>", array);
190     }
191 
192     @Test
193     public void testReflectionyteArray() {
194         byte[] array = new byte[] { 1, 2, -3, 4 };
195         final String baseString = this.toBaseString(array);
196         assertEquals(baseString + "[{1,2,-3,4}]", ToStringBuilder.reflectionToString(array));
197         array = null;
198         assertReflectionArray("<null>", array);
199     }
200 
201     @Test
202     public void testReflectionCharArray() {
203         char[] array = new char[] { 'A', '2', '_', 'D' };
204         final String baseString = this.toBaseString(array);
205         assertEquals(baseString + "[{A,2,_,D}]", ToStringBuilder.reflectionToString(array));
206         array = null;
207         assertReflectionArray("<null>", array);
208     }
209 
210     @Test
211     public void testReflectionDoubleArray() {
212         double[] array = new double[] { 1.0, 2.9876, -3.00001, 4.3 };
213         final String baseString = this.toBaseString(array);
214         assertEquals(baseString + "[{1.0,2.9876,-3.00001,4.3}]", ToStringBuilder.reflectionToString(array));
215         array = null;
216         assertReflectionArray("<null>", array);
217     }
218 
219     @Test
220     public void testReflectionFloatArray() {
221         float[] array = new float[] { 1.0f, 2.9876f, -3.00001f, 4.3f };
222         final String baseString = this.toBaseString(array);
223         assertEquals(baseString + "[{1.0,2.9876,-3.00001,4.3}]", ToStringBuilder.reflectionToString(array));
224         array = null;
225         assertReflectionArray("<null>", array);
226     }
227 
228     @Test
229     public void testReflectionBooleanArray() {
230         boolean[] array = new boolean[] { true, false, false };
231         final String baseString = this.toBaseString(array);
232         assertEquals(baseString + "[{true,false,false}]", ToStringBuilder.reflectionToString(array));
233         array = null;
234         assertReflectionArray("<null>", array);
235     }
236 
237     // Reflection Array Array tests
238 
239     @Test
240     public void testReflectionFloatArrayArray() {
241         float[][] array = new float[][] { { 1.0f, 2.29686f }, null, { Float.NaN } };
242         final String baseString = this.toBaseString(array);
243         assertEquals(baseString + "[{{1.0,2.29686},<null>,{NaN}}]", ToStringBuilder.reflectionToString(array));
244         array = null;
245         assertReflectionArray("<null>", array);
246     }
247 
248 
249     @Test
250     public void testReflectionLongArrayArray() {
251         long[][] array = new long[][] { { 1, 2 }, null, { 5 } };
252         final String baseString = this.toBaseString(array);
253         assertEquals(baseString + "[{{1,2},<null>,{5}}]", ToStringBuilder.reflectionToString(array));
254         array = null;
255         assertReflectionArray("<null>", array);
256     }
257 
258     @Test
259     public void testReflectionIntArrayArray() {
260         int[][] array = new int[][] { { 1, 2 }, null, { 5 } };
261         final String baseString = this.toBaseString(array);
262         assertEquals(baseString + "[{{1,2},<null>,{5}}]", ToStringBuilder.reflectionToString(array));
263         array = null;
264         assertReflectionArray("<null>", array);
265     }
266 
267     @Test
268     public void testReflectionhortArrayArray() {
269         short[][] array = new short[][] { { 1, 2 }, null, { 5 } };
270         final String baseString = this.toBaseString(array);
271         assertEquals(baseString + "[{{1,2},<null>,{5}}]", ToStringBuilder.reflectionToString(array));
272         array = null;
273         assertReflectionArray("<null>", array);
274     }
275 
276     @Test
277     public void testReflectionByteArrayArray() {
278         byte[][] array = new byte[][] { { 1, 2 }, null, { 5 } };
279         final String baseString = this.toBaseString(array);
280         assertEquals(baseString + "[{{1,2},<null>,{5}}]", ToStringBuilder.reflectionToString(array));
281         array = null;
282         assertReflectionArray("<null>", array);
283     }
284 
285     @Test
286     public void testReflectionCharArrayArray() {
287         char[][] array = new char[][] { { 'A', 'B' }, null, { 'p' } };
288         final String baseString = this.toBaseString(array);
289         assertEquals(baseString + "[{{A,B},<null>,{p}}]", ToStringBuilder.reflectionToString(array));
290         array = null;
291         assertReflectionArray("<null>", array);
292     }
293 
294     @Test
295     public void testReflectionDoubleArrayArray() {
296         double[][] array = new double[][] { { 1.0, 2.29686 }, null, { Double.NaN } };
297         final String baseString = this.toBaseString(array);
298         assertEquals(baseString + "[{{1.0,2.29686},<null>,{NaN}}]", ToStringBuilder.reflectionToString(array));
299         array = null;
300         assertReflectionArray("<null>", array);
301     }
302 
303     @Test
304     public void testReflectionBooleanArrayArray() {
305         boolean[][] array = new boolean[][] { { true, false }, null, { false } };
306         final String baseString = this.toBaseString(array);
307         assertEquals(baseString + "[{{true,false},<null>,{false}}]", ToStringBuilder.reflectionToString(array));
308         assertEquals(baseString + "[{{true,false},<null>,{false}}]", ToStringBuilder.reflectionToString(array));
309         array = null;
310         assertReflectionArray("<null>", array);
311     }
312 
313     // Reflection hierarchy tests
314     @Test
315     public void testReflectionHierarchyArrayList() {
316         // note, the test data depends on the internal representation of the ArrayList, which may differ between JDK versions and vendors
317         // representation different for IBM JDK 1.6.0, LANG-727
318         assumeFalse("IBM Corporation".equals(SystemUtils.JAVA_VENDOR) && "1.6".equals(SystemUtils.JAVA_SPECIFICATION_VERSION));
319         assumeFalse("Oracle Corporation".equals(SystemUtils.JAVA_VENDOR) && "1.6".compareTo(SystemUtils.JAVA_SPECIFICATION_VERSION) < 0);
320         final List<Object> list = new ArrayList<Object>();
321         final String baseString = this.toBaseString(list);
322         final String expectedWithTransients = baseString + "[elementData={<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>},size=0,modCount=0]";
323         final String toStringWithTransients = ToStringBuilder.reflectionToString(list, null, true);
324         if (!expectedWithTransients.equals(toStringWithTransients)) {
325             assertEquals(expectedWithTransients, toStringWithTransients);
326         }
327         final String expectedWithoutTransients = baseString + "[size=0]";
328         final String toStringWithoutTransients = ToStringBuilder.reflectionToString(list, null, false);
329         if (!expectedWithoutTransients.equals(toStringWithoutTransients)) {
330             assertEquals(expectedWithoutTransients, toStringWithoutTransients);
331         }
332     }
333 
334     @Test
335     public void testReflectionHierarchy() {
336         final ReflectionTestFixtureA baseA = new ReflectionTestFixtureA();
337         String baseString = this.toBaseString(baseA);
338         assertEquals(baseString + "[a=a]", ToStringBuilder.reflectionToString(baseA));
339         assertEquals(baseString + "[a=a]", ToStringBuilder.reflectionToString(baseA, null));
340         assertEquals(baseString + "[a=a]", ToStringBuilder.reflectionToString(baseA, null, false));
341         assertEquals(baseString + "[a=a,transientA=t]", ToStringBuilder.reflectionToString(baseA, null, true));
342         assertEquals(baseString + "[a=a]", ToStringBuilder.reflectionToString(baseA, null, false, null));
343         assertEquals(baseString + "[a=a]", ToStringBuilder.reflectionToString(baseA, null, false, Object.class));
344         assertEquals(baseString + "[a=a]", ToStringBuilder.reflectionToString(baseA, null, false, ReflectionTestFixtureA.class));
345 
346         final ReflectionTestFixtureB baseB = new ReflectionTestFixtureB();
347         baseString = this.toBaseString(baseB);
348         assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB));
349         assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB));
350         assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB, null));
351         assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB, null, false));
352         assertEquals(baseString + "[b=b,transientB=t,a=a,transientA=t]", ToStringBuilder.reflectionToString(baseB, null, true));
353         assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB, null, false, null));
354         assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB, null, false, Object.class));
355         assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB, null, false, ReflectionTestFixtureA.class));
356         assertEquals(baseString + "[b=b]", ToStringBuilder.reflectionToString(baseB, null, false, ReflectionTestFixtureB.class));
357     }
358 
359     static class ReflectionTestFixtureA {
360         @SuppressWarnings("unused")
361         private final char a='a';
362         @SuppressWarnings("unused")
363         private transient char transientA='t';
364     }
365 
366     static class ReflectionTestFixtureB extends ReflectionTestFixtureA {
367         @SuppressWarnings("unused")
368         private final char b='b';
369         @SuppressWarnings("unused")
370         private transient char transientB='t';
371     }
372 
373     @Test
374     public void testInnerClassReflection() {
375         final Outer outer = new Outer();
376         assertEquals(toBaseString(outer) + "[inner=" + toBaseString(outer.inner) + "[]]", outer.toString());
377     }
378 
379     static class Outer {
380         Inner inner = new Inner();
381         class Inner {
382             @Override
383             public String toString() {
384                 return ToStringBuilder.reflectionToString(this);
385             }
386         }
387         @Override
388         public String toString() {
389             return ToStringBuilder.reflectionToString(this);
390         }
391     }
392 
393     // Reflection cycle tests
394 
395     /**
396      * Test an array element pointing to its container.
397      */
398     @Test
399     public void testReflectionArrayCycle() {
400         final Object[] objects = new Object[1];
401         objects[0] = objects;
402         assertEquals(
403             this.toBaseString(objects) + "[{" + this.toBaseString(objects) + "}]",
404             ToStringBuilder.reflectionToString(objects));
405     }
406 
407     /**
408      * Test an array element pointing to its container.
409      */
410     @Test
411     public void testReflectionArrayCycleLevel2() {
412         final Object[] objects = new Object[1];
413         final Object[] objectsLevel2 = new Object[1];
414         objects[0] = objectsLevel2;
415         objectsLevel2[0] = objects;
416         assertEquals(
417             this.toBaseString(objects) + "[{{" + this.toBaseString(objects) + "}}]",
418             ToStringBuilder.reflectionToString(objects));
419         assertEquals(
420             this.toBaseString(objectsLevel2) + "[{{" + this.toBaseString(objectsLevel2) + "}}]",
421             ToStringBuilder.reflectionToString(objectsLevel2));
422     }
423 
424     @Test
425     public void testReflectionArrayArrayCycle() throws Exception {
426         final Object[][] objects = new Object[2][2];
427         objects[0][0] = objects;
428         objects[0][1] = objects;
429         objects[1][0] = objects;
430         objects[1][1] = objects;
431         final String basicToString = this.toBaseString(objects);
432         assertEquals(
433             basicToString
434                 + "[{{"
435                 + basicToString
436                 + ","
437                 + basicToString
438                 + "},{"
439                 + basicToString
440                 + ","
441                 + basicToString
442                 + "}}]",
443             ToStringBuilder.reflectionToString(objects));
444     }
445 
446     /**
447      * A reflection test fixture.
448      */
449     static class ReflectionTestCycleA {
450         ReflectionTestCycleB b;
451 
452         @Override
453         public String toString() {
454             return ToStringBuilder.reflectionToString(this);
455         }
456     }
457 
458     /**
459      * A reflection test fixture.
460      */
461     static class ReflectionTestCycleB {
462         ReflectionTestCycleA a;
463 
464         @Override
465         public String toString() {
466             return ToStringBuilder.reflectionToString(this);
467         }
468     }
469 
470     /**
471      * A reflection test fixture.
472      */
473     static class SimpleReflectionTestFixture {
474         Object o;
475 
476         public SimpleReflectionTestFixture() {
477         }
478 
479         public SimpleReflectionTestFixture(final Object o) {
480             this.o = o;
481         }
482 
483         @Override
484         public String toString() {
485             return ToStringBuilder.reflectionToString(this);
486         }
487     }
488 
489     private static class SelfInstanceVarReflectionTestFixture {
490         @SuppressWarnings("unused")
491         private final SelfInstanceVarReflectionTestFixture typeIsSelf;
492 
493         public SelfInstanceVarReflectionTestFixture() {
494             this.typeIsSelf = this;
495         }
496 
497         @Override
498         public String toString() {
499             return ToStringBuilder.reflectionToString(this);
500         }
501       }
502 
503     private static class SelfInstanceTwoVarsReflectionTestFixture {
504         @SuppressWarnings("unused")
505         private final SelfInstanceTwoVarsReflectionTestFixture typeIsSelf;
506         private final String otherType = "The Other Type";
507 
508         public SelfInstanceTwoVarsReflectionTestFixture() {
509             this.typeIsSelf = this;
510         }
511 
512         public String getOtherType(){
513             return this.otherType;
514         }
515 
516         @Override
517         public String toString() {
518             return ToStringBuilder.reflectionToString(this);
519         }
520       }
521 
522 
523     /**
524      * Test an Object pointing to itself, the simplest test.
525      */
526     @Test
527     public void testSimpleReflectionObjectCycle() {
528         final SimpleReflectionTestFixture simple = new SimpleReflectionTestFixture();
529         simple.o = simple;
530         assertEquals(this.toBaseString(simple) + "[o=" + this.toBaseString(simple) + "]", simple.toString());
531     }
532 
533     /**
534      * Test a class that defines an ivar pointing to itself.
535      */
536     @Test
537     public void testSelfInstanceVarReflectionObjectCycle() {
538         final SelfInstanceVarReflectionTestFixture test = new SelfInstanceVarReflectionTestFixture();
539         assertEquals(this.toBaseString(test) + "[typeIsSelf=" + this.toBaseString(test) + "]", test.toString());
540     }
541 
542     /**
543      * Test a class that defines an ivar pointing to itself.  This test was
544      * created to show that handling cyclical object resulted in a missing endFieldSeparator call.
545      */
546     @Test
547     public void testSelfInstanceTwoVarsReflectionObjectCycle() {
548         final SelfInstanceTwoVarsReflectionTestFixture test = new SelfInstanceTwoVarsReflectionTestFixture();
549         assertEquals(this.toBaseString(test) + "[typeIsSelf=" + this.toBaseString(test) + ",otherType=" + test.getOtherType().toString() + "]", test.toString());
550     }
551 
552 
553     /**
554      * Test Objects pointing to each other.
555      */
556     @Test
557     public void testReflectionObjectCycle() {
558         final ReflectionTestCycleA a = new ReflectionTestCycleA();
559         final ReflectionTestCycleB b = new ReflectionTestCycleB();
560         a.b = b;
561         b.a = a;
562         assertEquals(
563             this.toBaseString(a) + "[b=" + this.toBaseString(b) + "[a=" + this.toBaseString(a) + "]]",
564             a.toString());
565     }
566 
567     /**
568      * Test a nasty combination of arrays and Objects pointing to each other.
569      * objects[0] -&gt; SimpleReflectionTestFixture[ o -&gt; objects ]
570      */
571     @Test
572     public void testReflectionArrayAndObjectCycle() {
573         final Object[] objects = new Object[1];
574         final SimpleReflectionTestFixture simple = new SimpleReflectionTestFixture(objects);
575         objects[0] = simple;
576         assertEquals(
577             this.toBaseString(objects)
578                 + "[{"
579                 + this.toBaseString(simple)
580                 + "[o="
581                 + this.toBaseString(objects)
582                 + "]"
583                 + "}]",
584             ToStringBuilder.reflectionToString(objects));
585         assertEquals(
586             this.toBaseString(simple)
587                 + "[o={"
588                 + this.toBaseString(simple)
589                 + "}]",
590             ToStringBuilder.reflectionToString(simple));
591     }
592 
593     void validateNullToStringStyleRegistry() {
594         final Map<Object, Object> registry = ToStringStyle.getRegistry();
595         assertNull("Expected null, actual: "+registry, registry);
596     }
597     //  End: Reflection cycle tests
598 
599     @Test
600     public void testAppendSuper() {
601         assertEquals(baseStr + "[]", new ToStringBuilder(base).appendSuper("Integer@8888[]").toString());
602         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").toString());
603 
604         assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[]").append("a", "hello").toString());
605         assertEquals(baseStr + "[<null>,a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").append("a", "hello").toString());
606         assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendSuper(null).append("a", "hello").toString());
607     }
608 
609     @Test
610     public void testAppendToString() {
611         assertEquals(baseStr + "[]", new ToStringBuilder(base).appendToString("Integer@8888[]").toString());
612         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).appendToString("Integer@8888[<null>]").toString());
613 
614         assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendToString("Integer@8888[]").append("a", "hello").toString());
615         assertEquals(baseStr + "[<null>,a=hello]", new ToStringBuilder(base).appendToString("Integer@8888[<null>]").append("a", "hello").toString());
616         assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendToString(null).append("a", "hello").toString());
617     }
618 
619     @Test
620     public void testObject() {
621         final Integer i3 = Integer.valueOf(3);
622         final Integer i4 = Integer.valueOf(4);
623         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) null).toString());
624         assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(i3).toString());
625         assertEquals(baseStr + "[a=<null>]", new ToStringBuilder(base).append("a", (Object) null).toString());
626         assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", i3).toString());
627         assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", i3).append("b", i4).toString());
628         assertEquals(baseStr + "[a=<Integer>]", new ToStringBuilder(base).append("a", i3, false).toString());
629         assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), false).toString());
630         assertEquals(baseStr + "[a=[]]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), true).toString());
631         assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), false).toString());
632         assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), true).toString());
633         assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", (Object) new String[0], false).toString());
634         assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", (Object) new String[0], true).toString());
635     }
636     
637     @Test
638     public void testObjectBuild() {
639         final Integer i3 = Integer.valueOf(3);
640         final Integer i4 = Integer.valueOf(4);
641         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) null).build());
642         assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(i3).build());
643         assertEquals(baseStr + "[a=<null>]", new ToStringBuilder(base).append("a", (Object) null).build());
644         assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", i3).build());
645         assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", i3).append("b", i4).build());
646         assertEquals(baseStr + "[a=<Integer>]", new ToStringBuilder(base).append("a", i3, false).build());
647         assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), false).build());
648         assertEquals(baseStr + "[a=[]]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), true).build());
649         assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), false).build());
650         assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), true).build());
651         assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", (Object) new String[0], false).build());
652         assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", (Object) new String[0], true).build());
653     }
654 
655     @Test
656     public void testLong() {
657         assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(3L).toString());
658         assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", 3L).toString());
659         assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", 3L).append("b", 4L).toString());
660     }
661 
662     @SuppressWarnings("cast") // cast is not really needed, keep for consistency
663     @Test
664     public void testInt() {
665         assertEquals(baseStr + "[3]", new ToStringBuilder(base).append((int) 3).toString());
666         assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", (int) 3).toString());
667         assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", (int) 3).append("b", (int) 4).toString());
668     }
669 
670     @Test
671     public void testShort() {
672         assertEquals(baseStr + "[3]", new ToStringBuilder(base).append((short) 3).toString());
673         assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", (short) 3).toString());
674         assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", (short) 3).append("b", (short) 4).toString());
675     }
676 
677     @Test
678     public void testChar() {
679         assertEquals(baseStr + "[A]", new ToStringBuilder(base).append((char) 65).toString());
680         assertEquals(baseStr + "[a=A]", new ToStringBuilder(base).append("a", (char) 65).toString());
681         assertEquals(baseStr + "[a=A,b=B]", new ToStringBuilder(base).append("a", (char) 65).append("b", (char) 66).toString());
682     }
683 
684     @Test
685     public void testByte() {
686         assertEquals(baseStr + "[3]", new ToStringBuilder(base).append((byte) 3).toString());
687         assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", (byte) 3).toString());
688         assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", (byte) 3).append("b", (byte) 4).toString());
689     }
690 
691     @SuppressWarnings("cast")
692     @Test
693     public void testDouble() {
694         assertEquals(baseStr + "[3.2]", new ToStringBuilder(base).append((double) 3.2).toString());
695         assertEquals(baseStr + "[a=3.2]", new ToStringBuilder(base).append("a", (double) 3.2).toString());
696         assertEquals(baseStr + "[a=3.2,b=4.3]", new ToStringBuilder(base).append("a", (double) 3.2).append("b", (double) 4.3).toString());
697     }
698 
699     @Test
700     public void testFloat() {
701         assertEquals(baseStr + "[3.2]", new ToStringBuilder(base).append((float) 3.2).toString());
702         assertEquals(baseStr + "[a=3.2]", new ToStringBuilder(base).append("a", (float) 3.2).toString());
703         assertEquals(baseStr + "[a=3.2,b=4.3]", new ToStringBuilder(base).append("a", (float) 3.2).append("b", (float) 4.3).toString());
704     }
705 
706     @Test
707     public void testBoolean() {
708         assertEquals(baseStr + "[true]", new ToStringBuilder(base).append(true).toString());
709         assertEquals(baseStr + "[a=true]", new ToStringBuilder(base).append("a", true).toString());
710         assertEquals(baseStr + "[a=true,b=false]", new ToStringBuilder(base).append("a", true).append("b", false).toString());
711     }
712 
713 
714     @Test
715     public void testObjectArray() {
716         Object[] array = new Object[] {null, base, new int[] {3, 6}};
717         assertEquals(baseStr + "[{<null>,5,{3,6}}]", new ToStringBuilder(base).append(array).toString());
718         assertEquals(baseStr + "[{<null>,5,{3,6}}]", new ToStringBuilder(base).append((Object) array).toString());
719         array = null;
720         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
721         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
722     }
723 
724     @Test
725     public void testLongArray() {
726         long[] array = new long[] {1, 2, -3, 4};
727         assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append(array).toString());
728         assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append((Object) array).toString());
729         array = null;
730         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
731         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
732     }
733 
734     @Test
735     public void testIntArray() {
736         int[] array = new int[] {1, 2, -3, 4};
737         assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append(array).toString());
738         assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append((Object) array).toString());
739         array = null;
740         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
741         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
742     }
743 
744     @Test
745     public void testShortArray() {
746         short[] array = new short[] {1, 2, -3, 4};
747         assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append(array).toString());
748         assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append((Object) array).toString());
749         array = null;
750         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
751         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
752     }
753 
754     @Test
755     public void testByteArray() {
756         byte[] array = new byte[] {1, 2, -3, 4};
757         assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append(array).toString());
758         assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append((Object) array).toString());
759         array = null;
760         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
761         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
762     }
763 
764     @Test
765     public void testCharArray() {
766         char[] array = new char[] {'A', '2', '_', 'D'};
767         assertEquals(baseStr + "[{A,2,_,D}]", new ToStringBuilder(base).append(array).toString());
768         assertEquals(baseStr + "[{A,2,_,D}]", new ToStringBuilder(base).append((Object) array).toString());
769         array = null;
770         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
771         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
772     }
773 
774     @Test
775     public void testDoubleArray() {
776         double[] array = new double[] {1.0, 2.9876, -3.00001, 4.3};
777         assertEquals(baseStr + "[{1.0,2.9876,-3.00001,4.3}]", new ToStringBuilder(base).append(array).toString());
778         assertEquals(baseStr + "[{1.0,2.9876,-3.00001,4.3}]", new ToStringBuilder(base).append((Object) array).toString());
779         array = null;
780         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
781         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
782     }
783 
784     @Test
785     public void testFloatArray() {
786         float[] array = new float[] {1.0f, 2.9876f, -3.00001f, 4.3f};
787         assertEquals(baseStr + "[{1.0,2.9876,-3.00001,4.3}]", new ToStringBuilder(base).append(array).toString());
788         assertEquals(baseStr + "[{1.0,2.9876,-3.00001,4.3}]", new ToStringBuilder(base).append((Object) array).toString());
789         array = null;
790         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
791         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
792     }
793 
794     @Test
795     public void testBooleanArray() {
796         boolean[] array = new boolean[] {true, false, false};
797         assertEquals(baseStr + "[{true,false,false}]", new ToStringBuilder(base).append(array).toString());
798         assertEquals(baseStr + "[{true,false,false}]", new ToStringBuilder(base).append((Object) array).toString());
799         array = null;
800         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
801         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
802     }
803 
804     @Test
805     public void testLongArrayArray() {
806         long[][] array = new long[][] {{1, 2}, null, {5}};
807         assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append(array).toString());
808         assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append((Object) array).toString());
809         array = null;
810         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
811         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
812     }
813 
814     @Test
815     public void testIntArrayArray() {
816         int[][] array = new int[][] {{1, 2}, null, {5}};
817         assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append(array).toString());
818         assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append((Object) array).toString());
819         array = null;
820         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
821         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
822     }
823 
824     @Test
825     public void testShortArrayArray() {
826         short[][] array = new short[][] {{1, 2}, null, {5}};
827         assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append(array).toString());
828         assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append((Object) array).toString());
829         array = null;
830         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
831         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
832     }
833 
834     @Test
835     public void testByteArrayArray() {
836         byte[][] array = new byte[][] {{1, 2}, null, {5}};
837         assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append(array).toString());
838         assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append((Object) array).toString());
839         array = null;
840         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
841         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
842     }
843 
844     @Test
845     public void testCharArrayArray() {
846         char[][] array = new char[][] {{'A', 'B'}, null, {'p'}};
847         assertEquals(baseStr + "[{{A,B},<null>,{p}}]", new ToStringBuilder(base).append(array).toString());
848         assertEquals(baseStr + "[{{A,B},<null>,{p}}]", new ToStringBuilder(base).append((Object) array).toString());
849         array = null;
850         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
851         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
852     }
853 
854     @Test
855     public void testDoubleArrayArray() {
856         double[][] array = new double[][] {{1.0, 2.29686}, null, {Double.NaN}};
857         assertEquals(baseStr + "[{{1.0,2.29686},<null>,{NaN}}]", new ToStringBuilder(base).append(array).toString());
858         assertEquals(baseStr + "[{{1.0,2.29686},<null>,{NaN}}]", new ToStringBuilder(base).append((Object) array).toString());
859         array = null;
860         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
861         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
862     }
863 
864     @Test
865     public void testFloatArrayArray() {
866         float[][] array = new float[][] {{1.0f, 2.29686f}, null, {Float.NaN}};
867         assertEquals(baseStr + "[{{1.0,2.29686},<null>,{NaN}}]", new ToStringBuilder(base).append(array).toString());
868         assertEquals(baseStr + "[{{1.0,2.29686},<null>,{NaN}}]", new ToStringBuilder(base).append((Object) array).toString());
869         array = null;
870         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
871         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
872     }
873 
874     @Test
875     public void testBooleanArrayArray() {
876         boolean[][] array = new boolean[][] {{true, false}, null, {false}};
877         assertEquals(baseStr + "[{{true,false},<null>,{false}}]", new ToStringBuilder(base).append(array).toString());
878         assertEquals(baseStr + "[{{true,false},<null>,{false}}]", new ToStringBuilder(base).append((Object) array).toString());
879         array = null;
880         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
881         assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
882     }
883 
884     @Test
885     public void testObjectCycle() {
886         final ObjectCycle a = new ObjectCycle();
887         final ObjectCycle b = new ObjectCycle();
888         a.obj = b;
889         b.obj = a;
890 
891         final String expected = toBaseString(a) + "[" + toBaseString(b) + "[" + toBaseString(a) + "]]";
892         assertEquals(expected, a.toString());
893     }
894 
895     static class ObjectCycle {
896         Object obj;
897 
898         @Override
899         public String toString() {
900             return new ToStringBuilder(this).append(obj).toString();
901         }
902     }
903 
904     @Test
905     public void testSimpleReflectionStatics() {
906         final SimpleReflectionStaticFieldsFixture instance1 = new SimpleReflectionStaticFieldsFixture();
907         assertEquals(
908             this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345]",
909             ReflectionToStringBuilder.toString(instance1, null, false, true, SimpleReflectionStaticFieldsFixture.class));
910         assertEquals(
911             this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345]",
912             ReflectionToStringBuilder.toString(instance1, null, true, true, SimpleReflectionStaticFieldsFixture.class));
913         assertEquals(
914             this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345]",
915             this.toStringWithStatics(instance1, null, SimpleReflectionStaticFieldsFixture.class));
916         assertEquals(
917             this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345]",
918             this.toStringWithStatics(instance1, null, SimpleReflectionStaticFieldsFixture.class));
919     }
920 
921     /**
922      * Tests ReflectionToStringBuilder.toString() for statics.
923      */
924     @Test
925     public void testReflectionStatics() {
926         final ReflectionStaticFieldsFixture instance1 = new ReflectionStaticFieldsFixture();
927         assertEquals(
928             this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345,instanceString=instanceString,instanceInt=67890]",
929             ReflectionToStringBuilder.toString(instance1, null, false, true, ReflectionStaticFieldsFixture.class));
930         assertEquals(
931             this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345,staticTransientString=staticTransientString,staticTransientInt=54321,instanceString=instanceString,instanceInt=67890,transientString=transientString,transientInt=98765]",
932             ReflectionToStringBuilder.toString(instance1, null, true, true, ReflectionStaticFieldsFixture.class));
933         assertEquals(
934             this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345,instanceString=instanceString,instanceInt=67890]",
935             this.toStringWithStatics(instance1, null, ReflectionStaticFieldsFixture.class));
936         assertEquals(
937             this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345,instanceString=instanceString,instanceInt=67890]",
938             this.toStringWithStatics(instance1, null, ReflectionStaticFieldsFixture.class));
939     }
940 
941     /**
942      * Tests ReflectionToStringBuilder.toString() for statics.
943      */
944     @Test
945     public void testInheritedReflectionStatics() {
946         final InheritedReflectionStaticFieldsFixture instance1 = new InheritedReflectionStaticFieldsFixture();
947         assertEquals(
948             this.toBaseString(instance1) + "[staticString2=staticString2,staticInt2=67890]",
949             ReflectionToStringBuilder.toString(instance1, null, false, true, InheritedReflectionStaticFieldsFixture.class));
950         assertEquals(
951             this.toBaseString(instance1) + "[staticString2=staticString2,staticInt2=67890,staticString=staticString,staticInt=12345]",
952             ReflectionToStringBuilder.toString(instance1, null, false, true, SimpleReflectionStaticFieldsFixture.class));
953         assertEquals(
954             this.toBaseString(instance1) + "[staticString2=staticString2,staticInt2=67890,staticString=staticString,staticInt=12345]",
955             this.toStringWithStatics(instance1, null, SimpleReflectionStaticFieldsFixture.class));
956         assertEquals(
957             this.toBaseString(instance1) + "[staticString2=staticString2,staticInt2=67890,staticString=staticString,staticInt=12345]",
958             this.toStringWithStatics(instance1, null, SimpleReflectionStaticFieldsFixture.class));
959     }
960 
961     /**
962      * <p>This method uses reflection to build a suitable
963      * <code>toString</code> value which includes static fields.</p>
964      *
965      * <p>It uses <code>AccessibleObject.setAccessible</code> to gain access to private
966      * fields. This means that it will throw a security exception if run
967      * under a security manager, if the permissions are not set up correctly.
968      * It is also not as efficient as testing explicitly. </p>
969      *
970      * <p>Transient fields are not output.</p>
971      *
972      * <p>Superclass fields will be appended up to and including the specified superclass.
973      * A null superclass is treated as <code>java.lang.Object</code>.</p>
974      *
975      * <p>If the style is <code>null</code>, the default
976      * <code>ToStringStyle</code> is used.</p>
977      *
978      * @param <T> the type of the output object
979      * @param object  the Object to be output
980      * @param style  the style of the <code>toString</code> to create,
981      *  may be <code>null</code>
982      * @param reflectUpToClass  the superclass to reflect up to (inclusive),
983      *  may be <code>null</code>
984      * @return the String result
985      * @throws IllegalArgumentException if the Object is <code>null</code>
986      */
987     public <T> String toStringWithStatics(final T object, final ToStringStyle style, final Class<? super T> reflectUpToClass) {
988         return ReflectionToStringBuilder.toString(object, style, false, true, reflectUpToClass);
989     }
990 
991     /**
992      * Tests ReflectionToStringBuilder setUpToClass().
993      */
994     @Test
995     public void test_setUpToClass_valid() {
996         final Integer val = Integer.valueOf(5);
997         final ReflectionToStringBuilder test = new ReflectionToStringBuilder(val);
998         test.setUpToClass(Number.class);
999         test.toString();
1000     }
1001 
1002     /**
1003      * Tests ReflectionToStringBuilder setUpToClass().
1004      */
1005     @Test(expected=IllegalArgumentException.class)
1006     public void test_setUpToClass_invalid() {
1007         final Integer val = Integer.valueOf(5);
1008         final ReflectionToStringBuilder test = new ReflectionToStringBuilder(val);
1009         try {
1010             test.setUpToClass(String.class);
1011         } finally {
1012             test.toString();
1013         }
1014     }
1015 
1016     /**
1017      * Tests ReflectionToStringBuilder.toString() for statics.
1018      */
1019     class ReflectionStaticFieldsFixture {
1020         static final String staticString = "staticString";
1021         static final int staticInt = 12345;
1022         static final transient String staticTransientString = "staticTransientString";
1023         static final transient int staticTransientInt = 54321;
1024         String instanceString = "instanceString";
1025         int instanceInt = 67890;
1026         transient String transientString = "transientString";
1027         transient int transientInt = 98765;
1028     }
1029 
1030     /**
1031      * Test fixture for ReflectionToStringBuilder.toString() for statics.
1032      */
1033     class SimpleReflectionStaticFieldsFixture {
1034         static final String staticString = "staticString";
1035         static final int staticInt = 12345;
1036     }
1037 
1038     /**
1039      * Test fixture for ReflectionToStringBuilder.toString() for statics.
1040      */
1041     class InheritedReflectionStaticFieldsFixture extends SimpleReflectionStaticFieldsFixture {
1042         static final String staticString2 = "staticString2";
1043         static final int staticInt2 = 67890;
1044     }
1045 
1046     @Test
1047     public void testReflectionNull() {
1048         assertEquals("<null>", ReflectionToStringBuilder.toString(null));
1049     }
1050 
1051     /**
1052      * Points out failure to print anything from appendToString methods using MULTI_LINE_STYLE.
1053      * See issue LANG-372.
1054      */
1055     class MultiLineTestObject {
1056         Integer i = Integer.valueOf(31337);
1057         @Override
1058         public String toString() {
1059             return new ToStringBuilder(this).append("testInt", i).toString();
1060         }
1061     }
1062 
1063     @Test
1064     public void testAppendToStringUsingMultiLineStyle() {
1065         final MultiLineTestObject obj = new MultiLineTestObject();
1066         final ToStringBuilder testBuilder = new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
1067                                           .appendToString(obj.toString());
1068         assertEquals(testBuilder.toString().indexOf("testInt=31337"), -1);
1069     }
1070 
1071 }